package com.ywd.platform.websocket.config;

import com.ywd.platform.websocket.handler.MessageWebSocketHandler;
import com.ywd.platform.websocket.handler.UserHandshakeInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import lombok.RequiredArgsConstructor;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;

/**
 * WebSocket 配置类
 * 使用Spring的WebSocket支持配置服务端WebSocket参数，
 * 包括处理器注册、跨域设置、SockJS回退选项和容器属性。
 */
@RequiredArgsConstructor
@EnableWebSocket
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {

    private final MessageWebSocketHandler handler;       // 自定义消息处理器（处理连接/消息事件）
    private final UserHandshakeInterceptor interceptor;  // 自定义握手拦截器（如权限校验）

    /**
     * 注册WebSocket处理器和配置参数
     * @param registry WebSocket处理器注册中心
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(handler, "/ws")      // 绑定处理器到连接路径 `/ws`
                .addInterceptors(interceptor)           // 添加握手拦截器（可获取HTTP请求信息）
                .setAllowedOriginPatterns("*");         // 允许所有跨域请求（生产环境应替换为具体域名）
                //.withSockJS()                         // 启用SockJS支持（兼容不支持原生WebSocket的浏览器）
                //.setHeartbeatTime(30000);             // SockJS心跳间隔30秒（保持连接活性）
    }

    /**
     * 配置WebSocket容器底层参数
     * @return 容器工厂Bean
     */
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        // 设置文本消息缓冲区大小（单位：字节）
        container.setMaxTextMessageBufferSize(8192);    // 默认8KB，根据业务调整
        // 设置二进制消息缓冲区大小（单位：字节）
        container.setMaxBinaryMessageBufferSize(8192);  // 默认8KB，适合传输文件片段等
        // 设置会话空闲超时（单位：毫秒）
        container.setMaxSessionIdleTimeout(600000L);    // 10分钟无活动自动关闭连接
        // 设置异步发送超时（单位：毫秒）
        container.setAsyncSendTimeout(5000L);           // 发送操作超时时间
        return container;
    }


    // 添加全局 CORS 配置
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOriginPattern("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }


}